import { reqCartList, reqDeleteCartById, reqCheckedCart } from "@/api"
// 获取一个用uuid生成的一个唯一id来模拟游客身份。
import { getUUID } from "@/utils/uuid_token"

export default {
    actions: {
        // 获取购物车数据
        async getCartList({ commit }) {
            let result = await reqCartList()
            if (result.code == 200) {
                commit("GETCARTLIST", result.data)
            }
        },

        // 删除购物车商品
        async deleteCartById({ commit }, skuId) {
            let result = await reqDeleteCartById(skuId)
            if (result.code == 200) {
                return "ok"
            } else {
                return Promise.reject(new Error(result.message));
            }
        },

        // 切换商品选中状态
        async checkedCart({ commit }, { skuId, isChecked }) {
            let result = await reqCheckedCart(skuId, isChecked)
            if (result.code == 200) {
                return "ok"
            } else {
                return Promise.reject(new Error(result.message));
            }
        },

        // 删除所有选中的商品
        deletAllCheckedCart({ dispatch, getters }) {
            // 声明一个数组，储存符合要求的promise
            let promiseAll = []
            // 遍历全部商品，将isChecked == 1的全都删除掉
            getters.cartList.cartInfoList.forEach(item => {
                // dispatch("deleteCartById", item.skuId)返回的是一个promise，
                let promise = item.isChecked == 1 ? dispatch("deleteCartById", item.skuId) : ""
                // 将isChecked == 1的promise储存到promiseAll中
                promiseAll.push(promise)
            });
            // 只有每一个promise都成功，Promise.all(promiseAll)才会返回成功，否则返回失败。
            return Promise.all(promiseAll)
        },

        // 全选 or 全不选
        upDataCheckAll({ dispatch, getters }, isAllChecked) {
            let promiseAll = []
            getters.cartList.cartInfoList.forEach(item => {
                let promise = dispatch("checkedCart", {
                    skuId: item.skuId,
                    isChecked: isAllChecked,
                })
                promiseAll.push(promise)
            })
            return Promise.all(promiseAll)
        }
    },
    mutations: {
        GETCARTLIST(state, value) {
            state.cartList = value
        }
    },
    state: {
        cartList: [],
        uuid_token: getUUID()
    },
    getters: {
        cartList(state) {
            return state.cartList[0] || {}
        }
    }
}